﻿#define _CRT_SECURE_NO_WARNINGS 1

//类的新成员：static成员和类的好朋友：友元

#include<iostream>
using namespace std;

//static成员
int n = 0;

class A
{
public:
	A()
	{
		++n;
	}

	A(const A& a)
	{
		++n;
	}
private:
};

A Func()
{
	A aa;
	return aa;
}

int main()
{
	A aa1;
	A aa2;
	Func();

	cout << n << endl;
	return 0;
}


//1.2静态成员的概念
class A
{
public:
	A()
	{
		++n;
	}

	A(const A& a)
	{
		++n;
	}
//private:
	//静态成员是类的一部分，但它们不是类的对象的一部分
	//属于所有对象,属于整个类
	//声明
	static int n;
};

//定义,类中的全局变量
int A::n = 0;

A Func()
{
	A aa;
	return aa;
}

int main()
{
	A aa1;
	A aa2;
	Func();

	return 0;
}

//1.3  静态成员变量的访问
//1.3.1
class A
{
public:
	A()
	{
		++n;
	}

	A(const A& a)
	{
		++n;
	}
	//private:
		//静态成员是类的一部分，但它们不是类的对象的一部分
		//属于所有对象,属于整个类
		//声明
	static int n;
};

//定义,类中的全局变量
int A::n = 0;

A Func()
{
	A aa;
	return aa;
}

int main()
{
	A aa1;
	A aa2;
	Func();

	cout << aa1.n << endl;
	cout << aa2.n << endl;
	cout << A::n << endl;

	return 0;
}

1.3.2
class A
{
public:
	A()
	{
		++n;
	}

	A(const A& a)
	{
		++n;
	}

	int GetN()
	{
		return n;
	}

private:
	static int n;
};

//定义,类中的全局变量
int A::n = 0;

A Func()
{
	A aa;
	return aa;
}

int main()
{
	A aa1;
	A aa2;
	Func();

	cout << aa1.GetN() << endl;
	return 0;
}


//1.4静态成员函数
class A
{
public:
	A()
	{
		++n;
	}

	A(const A& a)
	{
		++n;
	}
	//static 成员函数没有this指针
	static int GetN()
	{
		//a++ 不能访问其他的
		return n;
	}

private:
	int a;
	static int n;
};

//定义,类中的全局变量
int A::n = 0;

A Func()
{
	A aa;
	return aa;
}

int main()
{
	A aa1;
	A aa2;
	Func();

	cout << aa1.GetN() << endl;
	cout << A::GetN() << endl;

	return 0;
}


//友元

//友元函数
//略...


//友元类
class Time
{
	friend class Date;
	// 声明日期类为时间类的友元类，则在日期类中就直接访问Time类 中的私有成员变量
public:
	Time(int hour = 0, int minute = 0, int second = 0) : _hour(hour)
		, _minute(minute)
		, _second(second)
	{}

private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1) : _year(year)
		, _month(month)
		, _day(day)
	{}

	void SetTimeOfDate(int hour, int minute, int second) 
	{
		// 直接访问时间类私有的成员变量   
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}

private:
	int _year;
	int _month;
	int _day;
	Time _t;
};


//题目练习：
//链接
//https://www.nowcoder.com/share/jump/1382204491715673789473

class Sum {
public:
	Sum() {
		_ret += _i;
		_i++;
	}

	static int GetRet() {
		return _ret;
	}
private:
	static int _i;
	static int _ret;
};

int Sum::_i = 1;
int Sum::_ret = 0;

class Solution {
public:
	int Sum_Solution(int n) {
		Sum a[n];
		return Sum::GetRet();
	}
};